#ifndef WAITFORACK_H
#define WAITFORACK_H

/*
  该类用于实现可靠传输。等待节点对配置信息包的ACK，如果没有，则重传。
  如果节点发送一个NACK，说明包错误，则不再重传
  */
#include <QObject>
#include <QMap>
class QTimer;

class WaitForAck : public QObject
{
    Q_OBJECT
public:
    explicit WaitForAck(QObject *parent = 0);
    void addOnePacket(qint64 nodeAddr,quint8 sN,QByteArray packet);
    void removeOnePacket(qint64 nodeAddr,quint8 sN); //通常是因为收到了NACK，不再重传
signals:
    void sigPacketToNodeAgain(QByteArray packet, qint64 destSubAddr); //再次发送
    void sigErrorInfo(QByteArray info);

public slots:
    void timerEventOfResend();

private:
    QMap <QByteArray,qint16> mapAddrSNConfTTL; //记录发送给某个节点的某个SN的配置信息包已经发送了多少次
    QMap <QByteArray,qint16> mapAddrSNSentTime; //记录发送给某个节点的某个SN的配置信息包已经发送了多久
    QMap <QByteArray,QByteArray> mapAddrSNConfData; //记录发送给某个节点的某个SN的配置数据包内容

    QTimer *timerOfResend;

};

#endif // WAITFORACK_H
